/* 
 * File:   VulnerabilidadService.cpp
 * Author: Maximiliano Monzon (82341)
 * 
 * Created on October 22, 2012, 4:58 AM
 */
#include <iomanip>
#include <string.h>
#include <sstream>
#include <vector>
#include <arpa/inet.h>
#include <cmath>
#include "server_EcoService.h"
#include "common_ProtocoloConstantes.h"
#include "common_Codec.h"
#include "server_Proceso.h"
#include "common_MutexScopeLocker.h"

using namespace std;
using namespace TP;
using namespace TP::Servicios;

#define COMANDO_INVALIDO 0
#define IP_INVALIDA 0
#define RECURSO_SERVICIO "PING"
#define ECO_MENSAJE "PING"

EcoService::EcoService() : Service(RECURSO_SERVICIO) {}
        
EcoService::~EcoService() {}

void EcoService::Iniciar() throw (Excepcion&){}

void EcoService::Finalizar() throw (Excepcion&){}

void EcoService::mensajeEntranteManejador(IMensajero* pMensajero, const string & pMensaje){

    try
    {
        // <token>|<ECO_SERVICE>|<Ping>
        
        hidratarMensaje(pMensaje);
        validarIntegridadMensaje();
        
        if (getNombre() != getMensaje()[1]) return;
        
        // Se determina a que accion corresponde el mensaje.

        if (ECO_MENSAJE == getMensaje() [2])
        {
            this->responderEco (pMensajero, getMensaje());
        } 
    }
    catch (int &pEx)
    {
        try
        {
            string respuesta = "";
            respuesta += ERROR;
            respuesta += SEPARADOR_CAMPO;
            respuesta += "Comando no reconocido.";
            
            pMensajero->Responder(respuesta);
        }
        catch (Excepcion& pEx)
        {
            cerr << pEx.what() << endl;
        }
    }
}

bool EcoService::ipValida (const string& pIp) {

    char str_aux [256];

    bool ip_valida = inet_pton(AF_INET, pIp.c_str(), str_aux);

    if (!ip_valida)
        ip_valida = inet_pton(AF_INET6, pIp.c_str(), str_aux);
    
    return ip_valida;
}

void EcoService::responderEco(IMensajero* pMensajero, vector<string> &pComando) {
    try
    {
        string msg = pComando[0];
        msg += SEPARADOR_CAMPO;
        msg += OK;
        pMensajero->Responder(msg);
    }
    catch (Excepcion &ex)
    {
        cerr << ex.what() << endl;
    }
}

